/*
 * @(#)ExitSecurityManager.java	1.0 Mar 7, 2008
 *
 *	The MIT License
 *
 *	Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>
 *
 *	Permission is hereby granted, free of charge, to any person obtaining a copy
 *	of this software and associated documentation files (the "Software"), to deal
 *	in the Software without restriction, including without limitation the rights
 *	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *	copies of the Software, and to permit persons to whom the Software is
 *	furnished to do so, subject to the following conditions:
 *
 *	The above copyright notice and this permission notice shall be included in
 *	all copies or substantial portions of the Software.
 *
 *	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *	THE SOFTWARE.
 */
package org.eoti.security.securityManager;

import org.eoti.util.RuntimeUtil;

import java.security.Permission;

public class ExitSecurityManager
extends SecurityManager
{
	protected Object owner = null;
	protected boolean exitEnabled = true;
	protected static final String permissionName = "exitVM";

	public ExitSecurityManager(Object owner)
	{
		this.owner = owner;
		exitEnabled = false;
		System.setSecurityManager(this);
	}

	public void setExitEnabled(boolean exitEnabled)
	{
		if(!RuntimeUtil.whoCalledMe().getClassName().equals(owner.getClass().getName()))
			SecurityAccessException.throwAccessException();

		this.exitEnabled = exitEnabled;
	}

	public boolean isExitEnabled(){return exitEnabled;}

	public void checkPermission(Permission p)
	{
		if(!(p instanceof RuntimePermission))
			return;

		if(!p.getName().equals(permissionName))
			return;

		if(exitEnabled)
			return;

		throw new VMExitBlockedException();
	}

	public void checkPermission(Permission p, Object context)
	{
        // context doesn't change anything for this permission
		// even if the owner wants to exit, they have to enable exit first
		checkPermission(p);
	}
}
